/*
 * @Author: ZhangXiaodong
 * @Date: 2025-04-20 01:51:51
 * @LastEditors: ZhangXiaodong
 * @LastEditTime: 2025-04-26 00:27:32
 * @Description: 数据库配置
 * @FilePath: /blog-ost/src/db/mysql/db.pool.js
 */
const path = require("path");
const mysql = require("mysql2/promise");
const config = require("../../config/mysql/db.config");

console.log(path.resolve(__dirname, "/src/config/mysql/db.config.js"))

class MysqlPool {
  constructor() {
    
    this.pool = mysql.createPool(config);
  }

  // 执行sql
  async exec(sql, params) {
    const promise = new Promise(async (resolve, reject) => {
      const connection = await this.pool.getConnection();
      try {
        connection.execute(sql, params).then(([rows, fields]) => {
          resolve( rows );
        });
             
      } catch (error) {
        reject(error);
      } finally {
        connection.release();
      }
    });
    return promise;
  }

  /**
   * 执行数据库事务操作
   * 该方法会开启一个数据库事务，执行传入的回调函数，若执行成功则提交事务，失败则回滚事务
   * @param {Function} callback - 一个异步回调函数，接收数据库连接对象作为参数
   * @returns {Promise<any>} - 返回回调函数执行的结果
   * @throws {Error} - 若事务执行过程中出现错误，将抛出该错误
   */
  async transaction(callback) {
    // 从连接池中获取一个数据库连接
    let connection;
    try {
      connection = await this.pool.getConnection();
      // 开启事务
      await connection.beginTransaction();
      // 执行回调函数
      const result = await callback(connection);
      // 提交事务
      await connection.commit();
      return result;
    } catch (error) {
      if (connection) {
        // 出现错误时回滚事务
        await connection.rollback();
      }
      throw error;
    } finally {
      if (connection) {
        // 释放连接回连接池
        connection.release();
      }
    }
  }

  /**
   * 获取数据库连接池的状态
   * @returns {Object} - 包含空闲连接数和总连接数的对象
   */
  getPoolStatus() {
    // 注意：直接访问 _freeConnections 和 _allConnections 依赖于 mysql2 内部实现，可能不稳定
    return {
      free: this.pool._freeConnections.length,
      total: this.pool._allConnections.length,
    };
  }
}


module.exports = new MysqlPool();